package singleton

import (
	"fmt"
	"sync"
	"sync/atomic"
)

// service 模拟高成本对象（例如数据库连接池、API 客户端）。
type service struct {
	endpoint string
}

func (s *service) Ping() string {
	return fmt.Sprintf("pong from %s", s.endpoint)
}

// 使用 atomic.Pointer 持有单例指针，避免重复读写导致的数据竞态。
// initMu 只在指针为 nil 时参与竞争。
var (
	svcPtr atomic.Pointer[service]
	initMu sync.Mutex
)

// NewServiceConfig 返回单例服务实例。
// 通过原子读 → 判空 → 加锁 → 再次判空 → 初始化，保证线程安全且避免额外锁竞争。
func NewServiceConfig(endpoint string) *service {
	if existing := svcPtr.Load(); existing != nil {
		return existing
	}

	initMu.Lock()
	defer initMu.Unlock()

	if existing := svcPtr.Load(); existing != nil {
		return existing
	}

	newSvc := &service{endpoint: endpoint}
	svcPtr.Store(newSvc)
	return newSvc
}
